import { ApiRes } from '@/types/data'
import { useMemeberStore } from '@/store/member'
// 接口服务器基地址
const BASEURL = 'https://pcapi-xiaotuxian-front-devtest.itheima.net'
// const BASEURL = 'https://pcapi-xiaotuxian-front.itheima.net'

// 参考：https://uniapp.dcloud.net.cn/api/interceptor.html
uni.addInterceptor('request', {
  // 拦截前触发
  invoke(args: UniApp.RequestOptions) {
    if (!(args.url as string).startsWith('http')) {
      // 拼接基地址
      args.url = BASEURL + args.url
    }

    // 添加上请求头信息
    args.header = {
      ...args.header,
      'source-client': 'miniapp'
    }

    // 在非vue文件中，哪里使用 Store 就在哪里调用
    const memberStore = useMemeberStore()
    // 如果登录了，就携带上token
    if (memberStore.isLogin) {
      args.header.Authorization = memberStore.profile.token
    }
  }
})

// 上传文件拦截器
uni.addInterceptor('uploadFile', {
  // 拦截前触发
  invoke(args: UniApp.RequestOptions) {
    if (!(args.url as string).startsWith('http')) {
      // 拼接基地址
      args.url = BASEURL + args.url
    }

    // 添加上请求头信息
    args.header = {
      ...args.header,
      'source-client': 'miniapp'
    }

    // 在非vue文件中，哪里使用 Store 就在哪里调用
    const memberStore = useMemeberStore()
    // 如果登录了，就携带上token
    if (memberStore.isLogin) {
      args.header.Authorization = memberStore.profile.token
    }
  }
})

// 封装通用请求方法并且暴露出去
export const http = <T>(options: UniApp.RequestOptions) => {
  // Promise对象，Promise的泛型用于确定 resolve 的回调结果类型
  return new Promise<T>((resolve, reject) => {
    uni.request({
      ...options,
      // header: {
      //   'source-client': 'miniapp'
      // },
      success: res => {
        if (res.statusCode >= 200 && res.statusCode <= 300) {
          resolve((res.data as ApiRes).result)
        } else {
          uni.showToast({
            title: (res.data as any).message,
            icon: 'error'
          })
        }
      },
      fail: err => {
        reject(err)
      }
    })
  })
}
